#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>


/* 链表作为公共数据，需要被上互斥锁 */

struct msg {
    struct msg *next;
    int num;
};

struct msg *head;

/*静态初始化一个条件变量和一个互斥变量*/
pthread_cond_t has_product = PTHREAD_COND_INITIALIZER;
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

void *consumer(void *p){
    struct msg *mp;
    for(;;){
        pthread_mutex_lock(&lock);
        while(head==NULL){   //头指针为空，说明没有节点 不可以用if
            pthread_cond_wait(&has_product,&lock);
        }
        mp = head;
        head = mp->next;
        pthread_mutex_unlock(&lock);

        printf("consume %lu---%d\n",pthread_self(),mp->num);
        free(mp);
        sleep(rand()%5);
    }
}

void *producer(void *p){
    struct msg *mp;
    for(;;){
        mp = malloc(sizeof(struct msg));
        mp->num = rand()%1000 + 1;
        printf("prduce --- %d\n",mp->num);
        pthread_mutex_lock(&lock);
        mp->next= head;
        head = mp;
        pthread_mutex_unlock(&lock);
        pthread_cond_signal(&has_product);
        sleep(rand()%5);
    }
}
int main(){
    pthread_t pid,cid;
    srand(time(NULL));
    pthread_create(&pid,NULL,producer,NULL);
    pthread_create(&cid,NULL,consumer,NULL);
    pthread_join(pid,NULL);
    pthread_join(cid,NULL);
    return 0;

}